package core

import (
	"context"
	"fmt"
	"gvb-server/global"

	"github.com/go-redis/redis/v8"
)

type RedisClient struct {
	client *redis.Client
}

// NewRedisClient 创建一个新的RedisClient实例
func NewRedisClient() (rdb *redis.Client) {
	rdb = redis.NewClient(&redis.Options{
		Addr:     fmt.Sprintf("%s:%d", global.Config.Redis.Host, global.Config.Redis.Prot),
		Password: global.Config.Redis.Password,
		DB:       0,
		PoolSize: 100,
	})

	ctx := context.Background()

	// 测试连接
	pong, err := rdb.Ping(ctx).Result()
	if err != nil {
		global.Log.Error(err)
		return
	}
	if pong != "PONG" {
		global.Log.Error(fmt.Errorf("unexpected response from Redis: %s", pong))
		return
	}

	return
}

// SelectDB 动态选择数据库
func (rc *RedisClient) SelectDB(db int) (rdb *redis.Client) {
	// 这里我们简单地创建一个新的客户端来选择不同的数据库
	// 在实际应用中，你可能想要缓存这些客户端或采用其他策略来避免频繁创建客户端
	rdb = redis.NewClient(&redis.Options{
		Addr:     fmt.Sprintf("%s:%d", global.Config.Redis.Host, global.Config.Redis.Prot),
		Password: global.Config.Redis.Password,
		DB:       db,
		PoolSize: 100,
	})
	ctx := context.Background()

	// 测试连接
	pong, err := rdb.Ping(ctx).Result()
	if err != nil {
		global.Log.Error(err)
		return
	}
	if pong != "PONG" {
		global.Log.Error(fmt.Errorf("unexpected response from Redis: %s", pong))
		return
	}
	return
}

var SRdb = new(RedisClient)

//
//// Set 例如，你可以使用以下方法来设置和获取键值对
//func (rc *RedisClient) Set(key string, value string) error {
//	return rc.client.Set(rc.ctx, key, value, 0).Err()
//}
//
//func (rc *RedisClient) Get(key string) (string, error) {
//	val, err := rc.client.Get(rc.ctx, key).Result()
//	if err == redis.Nil {
//		return "", nil // 键不存在时返回空值和nil错误
//	}
//	return val, err
//}
